package com.yiboshi.rehrs.util;

import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;

@Slf4j
public class ThumbnailatorUtils {

    /**
     * 根据图片 Base64 压缩图片并生成新的 Base64
     *
     * @param base64Image 输入的图片 Base64 字符串
     * @param minWidth    最小宽度
     * @param minHeight   最小高度
     * @return 压缩后的图片 Base64 字符串
     */
    public static String compressBase64Image(String base64Image, int minWidth, int minHeight) {
        try {
            // 去掉 Base64 前缀（如果有）
            String imageData = base64Image.contains(",") ? base64Image.split(",")[1] : base64Image;

            // 将 Base64 转换为字节数组
            byte[] imageBytes = Base64.getDecoder().decode(imageData);
            ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);

            // 读取图片
            BufferedImage originalImage = ImageIO.read(bis);

            // 获取原始图片的宽高
            int originalWidth = originalImage.getWidth();
            int originalHeight = originalImage.getHeight();

            // 计算压缩后的宽高（缩小为原来的一半）
            int newWidth = Math.max(originalWidth / 2, minWidth);
            int newHeight = Math.max(originalHeight / 2, minHeight);

            // 使用 Thumbnailator 压缩图片
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            Thumbnails.of(originalImage)
                    .size(newWidth, newHeight) // 设置新的宽高
                    .outputQuality(0.8)       // 设置压缩质量 (0.0 - 1.0)
                    .toOutputStream(baos);

            // 将压缩后的图片转换为 Base64 字符串
            return Base64.getEncoder().encodeToString(baos.toByteArray());
        } catch (Exception e) {
           log.error("",e);
            return null;
        }
    }

    /**
     * 根据图片 Base64 压缩图片并返回新的 Base64
     *
     * @param base64Image 图片的 Base64 字符串
     * @param quality     压缩质量 (0.0 - 1.0)
     * @return 压缩后的图片 Base64 字符串
     */
    public static String compressBase64Image(String base64Image, double quality) {
        try {
            // 去掉 Base64 前缀（如果有）
            String imageData = base64Image.contains(",") ? base64Image.split(",")[1] : base64Image;

            // 将 Base64 转换为字节数组
            byte[] imageBytes = Base64.getDecoder().decode(imageData);
            ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);

            // 创建输出流用于存储压缩后的图片
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            // 使用 Thumbnailator 压缩图片
            Thumbnails.of(bis)
                    .scale(0.8)
                    //.size(maxWidth, maxHeight)       // 设置最大宽高
                    .outputQuality(quality)          // 设置压缩质量 (0.0 - 1.0)
                    .outputFormat("jpg")             // 输出格式为 JPEG
                    .toOutputStream(baos);           // 输出到字节数组流

            // 获取压缩后的字节数组，并转换为 Base64
            byte[] compressedImageBytes = baos.toByteArray();
            return Base64.getEncoder().encodeToString(compressedImageBytes);
        } catch (Exception e) {
            log.error("",e);
            return "";
        }
    }


    public static boolean toImageFromBase64(String base64String, String outputFilePath) {
        if (base64String == null || base64String.isEmpty()) {
            return false;
        }
        try {
            // 去掉 Base64 前缀（如果有）
            if (base64String.contains(",")) {
                base64String = base64String.split(",")[1];
            }

            // 解码 Base64 字符串为字节数组
            byte[] imageBytes = Base64.getDecoder().decode(base64String);

            // 使用 Thumbnails 工具进行缩放
            Thumbnails.of(new ByteArrayInputStream(imageBytes))
                    .scale(0.9d)
                    .outputFormat("jpg") // 设置输出格式
                    .toFile(outputFilePath); // 输出到文件

            return true; // 成功
        } catch (IOException e) {
            log.error("",e);
        }

        return false; // 失败
    }


}